package com.ply.flashsalessystem.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ply.flashsalessystem.annotation.AuthorityName;
import com.ply.flashsalessystem.annotation.UserAuthority;
import com.ply.flashsalessystem.entity.pojo.*;
import com.ply.flashsalessystem.entity.result.Result;
import com.ply.flashsalessystem.entity.wrapper.UserWrapper;
import com.ply.flashsalessystem.service.OrderForGoodsDetaileService;
import com.ply.flashsalessystem.service.OrderForGoodsService;
import com.ply.flashsalessystem.service.StoreService;
import com.ply.flashsalessystem.service.UserService;
import com.ply.flashsalessystem.utils.RuleUtils;
import com.ply.flashsalessystem.utils.UserUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author XiaoPan
 * @since 2022-03-23
 */
@RestController
@RequestMapping("/user")
@CrossOrigin
@Api("用户 接口")
public class UserController {
    /**
     * 1    对于商品 查看
     * <p>
     * 2    对于购物车 增删改查
     * <p>
     * 3    对于订单  增 查
     * <p>
     * 4    为订单 付款
     * <p>
     * 5    对于个人信息的 改查
     */

    @Autowired
    UserService userService;

    @Autowired
    StoreService storeService;

    @Autowired
    OrderForGoodsDetaileService orderForGoodsDetaileService;

    @Autowired
    OrderForGoodsService orderForGoodsService;

    /**
     * 修改密码
     *
     * @param oldPwd 原先密码
     * @param newPwd 新密码
     * @return 修改成功是否
     */

//    @AuthorityName(authorityId = 63, authorityName = "用户 修改密码")
    @UserAuthority
    @ApiOperation("用户修改密码")
    @PutMapping("updatePwd/{oldPwd}/{newPwd}")
    public Result updatePwd(@PathVariable("oldPwd") String oldPwd,
                            @PathVariable("newPwd") String newPwd) {
        // 正则 效验 密码
        if (!RuleUtils.pwdPattern(newPwd)) {
            return Result.error().message(RuleUtils.pwdError);
        }

        return userService.updatePwd(oldPwd, newPwd)
                ? Result.ok().message("密码修改成功")
                : Result.error().message("密码修改失败");
    }

    /**
     * 修改默认地址    name    iphone  头像avatar
     *
     * @param user 新的用户信息
     * @return 修改成功是否
     */
//    @AuthorityName(authorityId = 64, authorityName = "用户 修改用户信息")
    @UserAuthority
    @PutMapping("updateUser")
    @ApiOperation("修改用户信息")
    public Result updateUser(@RequestBody User user) {
        //给用户 id 设定好
        user.setUserId(UserUtils.getUserId());
        return userService.updateUser(user)
                ? Result.ok().message("修改成功")
                : Result.error().message("修改失败");
    }

    /**
     * 修改 默认地址
     * todo 默认地址 有点问题 可以思考下   店家如果 被 删除了   或者 店家修改了地址    默认地址怎么办?  这里可以存的 是 商家id
     *
     * @return 修改成功是否
     */
//    @AuthorityName(authorityId = 65, authorityName = "用户 修改默认地址")
    @UserAuthority
    @PutMapping("updateUserAddress/{storeId}")
    @ApiOperation("修改默认地址")
    public Result updateUserAddress(@PathVariable("storeId") Long storeId) {
        //给用户 id 设定好
        User user = userService.getUser(UserUtils.getUserId());

        Store byId = storeService.getById(storeId);
        user.setDafaultAddress(byId.getStoreAddress());

        return userService.updateUser(user)
                ? Result.ok().message("修改成功")
                : Result.error().message("修改失败");
    }

    /**
     * 查询自己的信息
     */
//    @AuthorityName(authorityId = 66, authorityName = "用户 查询自己的信息")
    @UserAuthority
    @ApiOperation("查询自己的信息")
    @GetMapping("getUserInfo")
    public Result getUserInfo() {
        User user = userService.getUser(UserUtils.getUserId());
        return Result.ok().message("查询成功")
                .data("roles", "user")
                .data("id", user.getUserId())
                .data("iphone", user.getIphone())
                .data("name", user.getUserName())
                .data("money", user.getBalanceMoney())
                .data("defaultAddress", user.getDafaultAddress())
                .data("avatar", user.getAvatar())
                .data("createTime", user.getCreateTime());
    }

    // 管理员 查询所有用户
    // 用户 的 查询
    @AuthorityName(authorityId = 67, authorityName = "管理员 条件分页查询用户")
    @PostMapping(value = {"admin/getUserAll/{current}/{limit}","admin/getUserAll"})
    @ApiOperation("条件 分页 查询 用户")
    public Result getUserAll(@PathVariable(value = "current",required = false) Integer current,
                             @PathVariable(value = "limit",required = false) Integer limit,
                             @RequestBody(required = false) UserWrapper userWrapper) {
        if (current == null || limit == null) {
            current = 0;
            limit = 10;
        }
        if (userWrapper == null) {
            userWrapper = new UserWrapper();
        }
        Page<User> userAll = userService.getUserAll(current, limit, userWrapper);
        return Result.ok()
                .message("查询成功")
                .data("total", userAll.getTotal())
                .data("rows", userAll.getRecords());
    }
    /**
     * 逻辑删除 用户 逻辑删除
     */
    @AuthorityName(authorityId = 68, authorityName = "管理员 逻辑删除用户")
    @ApiOperation("逻辑删除 用户")
    @DeleteMapping("deleteUserId/{userId}")
    public Result deleteUserId(@PathVariable("userId") Integer userId) {
        if (userService.getById(userId) == null) {
            throw new RuntimeException("userid 错误");
        }
        userService.removeById(userId);
        return Result.ok().message("删除成功");
    }
}

